본문으로 건너뛰기

TCP 연결의 보안: TLS

보안 서비스가 추가되어 향상된 TCP 버전을 흔히 TLS(Transport Layer Security)라고 부른다.
TLS는 기밀성, 데이터 무결성, 서버인증과 클라이언트 인증을 통해 TCP를 향상하여 보안 서비스를 제공한다.

TLS는 TCP를 보호하기 때문에 TCP 상에서 일어나는 어떠한 애플리케이션에든 사용될 수 있다.

TLS는 소켓을 사용하는 간단한 API를 제공하는데, TCP의 API와 유사하다. TLS는 애플리케이션 계층에 존재하나 개발자의 관점에서는 보안 서비스로 강화된 TCP 서비스를 제공하는 트랜스포트 프로토콜이다.

8.6.1 TLS 개요: almost TLS

TLS을 이해하기 위해 TLS의 단순화된 버전인 almost-TLS를 먼저 설명한다. almost-TLS는 핸드셰이크, 키 유도, 데이터 전송이라는 세 단계로 되어 있다.

핸드셰이크

  1. 클라이언트는 서버와 TCP 연결을 설립한다.
  2. 서버가 진짜 서버인지 확인한다.
  • 클라이언트는 hello 메시지를 보내고, 서버는 CA로 부터 인증된 인증서를 보내어 클라이언트는 인증서 내의 공개키가 서버의 것이라는 것을 믿을 수 있다.
  1. TLS 세션에 필요한 모든 대칭키를 생성하기 위해 서버와 클라이언트가 사용할 주 비밀키(Master Secret, MS)를 생성하여 전송한다.
  • MS를 모낼 때, 서버의 공개키로 암호화하여 EMS(Encrypted Master Secret)을 만든다.
  • 서버는 자신의 개인키로 EMS를 복호화하여 MS를 얻는다.
  • 즉 둘은 둘만 아는 MS를 알게 된다.

키 유도

공유한 MS는 모든 암호화 데이터 무결성 검사를 위한 대칭 세션키로 사용될 수 있으나 일반적으로 각각 다른 암호화키를 사용하는 것이 좀 더 안전하다.

따라서 MS를 이용하여 4개의 키를 만든다.

  • E(b) = 클라이언트가 서버에 보내는 데이터에 대한 세션 암호화 키
  • M(b) = 클라이언트가 서버에 보내는 데이터에 대한 HMAC(메시지 인증 코드)키
  • E(a) = 서버가 클라이언트에 보내는 데이터에 대한 세션 암호화 키
  • M(a) = 서버가 클라이언트에 보내는 데이터에 대한 HMAC(메시지 인증 코드)키

이는 단순히 MS를 4개의 키를 쪼개어 이루어진다.
2개의 암호화 키는 데이터를 암호화하고, 2개의 HMAC 키는 데이터의 무결성을 확인하는데 사용된다.

데이터 전송

TCP는 바이트 스트림 프로토콜이므로, TLS가 애플리케이션 데이터를 끊임없이 암호화하고 암호화된 데이터를 TCP에 쉴 새 없이 전달하는 것이 자연스럽다. 그렇다면 HMAC은 언제 해야할까?

분명한건 전체 세션 시간 동안 전송된 모든 데이터의 무결성을 확인하는 일이 TCP 세션이 종료될 때까지 미뤄둘 수 없다는 것이다. TLS는 데이터 스트림을 레코드로 쪼개고 각 레코드에 무결성 검사를 위한 HMAC을 덧붙인 후 이 레코드 + HMAC을 암호화한다.